
//此源码被清华学神尹成大魔王专业翻译分析并修改
//尹成QQ77025077
//尹成微信18510341407
//尹成所在QQ群721929980
//尹成邮箱 yinc13@mails.tsinghua.edu.cn
//尹成毕业于清华大学,微软区块链领域全球最有价值专家
//https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
//版权所有（c）2015-2016 BTCSuite开发者
//此源代码的使用由ISC控制
//可以在许可文件中找到的许可证。

/*
包对等为创建和管理比特币网络提供了一个公共基础
同龄人。

概述

这个包建立在电线包的基础上，它提供了
为简化比特币有线协议，必须使用原语。
创建完全功能对等体的过程。本质上，它提供了
用于创建并发安全完全验证节点的公共基础，简化
支付验证（SPV）节点、代理等。

同伴提供的主要功能的快速概述如下：

 -提供处理比特币的基本并发安全比特币对等点
   通过对等协议进行通信
 -比特币协议报文的全双工读写
 -自动处理初始握手过程，包括协议
   版本协商
 -具有可选通道的出站消息的异步消息队列
   消息实际发送时的通知
 -灵活的对等配置
   -呼叫者负责创建传出连接并监听
     传入连接，因此它们可以灵活地将连接建立为
     他们认为合适（代理人等）
   -用户代理名称和版本
   -比特币网络
   -服务支持信号（全节点、Bloom过滤器等）
   -支持的最大协议版本
   -能够注册回拨以处理比特币协议消息
 -库存消息批处理和发送具有已知库存检测的滴流
   避免
 -自动定期保持活动的乒乓和乒乓响应
 -随机非ce生成和自连接检测
 -当调用方不使用Bloom筛选器时，正确处理与Bloom筛选器相关的命令
   指定信号支持的相关标志
   -当协议版本足够高时，断开对等机连接
   -不调用旧协议版本的相关回调
 -Snapshottable对等统计信息，如读取的字节总数和
   写入、远程地址、用户代理和协商的协议版本
 -helper函数推送地址、getBlocks、getHeaders和reject
   信息
   -这些都可以通过标准消息输出功能手动发送，
     但是助手提供了额外的很好的功能，比如复制。
     过滤和地址随机化
 -等待关闭/断开的能力
 -全面的测试覆盖

对等机配置

所有对等配置都是用config结构处理的。这允许
调用方指定诸如用户代理名称和版本、比特币等内容
要使用的网络，它支持哪些服务，以及比特币时调用的回调
收到消息。请参阅配置的每个字段的文档
结构以获取更多详细信息。

入站和出站对等机

对等机可以是入站的，也可以是出站的。呼叫方负责
建立到远程对等机的连接并侦听传入对等机。
这为通过代理进行连接、执行操作等操作提供了很高的灵活性。
as a proxy, creating bridge peers, choosing whether to listen for inbound peers,
等。

NewOutboundPeer和NewInboundPeer函数之后必须调用Connect
将net.conn实例连接到对等机。这将启动所有异步I/O goroutine
启动协议协商过程。完成对等呼叫后
断开连接以断开与对等机的连接并清除所有资源。
WaitForDisconnect可用于阻止，直到对等端断开连接和资源
清理已完成。

回调

为了对同龄人做任何有用的事情，必须对比特币做出反应。
信息。这是通过创建消息侦听器的实例来完成的。
具有要调用的回调的结构，并设置Listeners字段
创建对等结构时指定的配置结构。

为了方便起见，所有当前支持的比特币都有一个回调挂钩。
暴露接收对等实例和具体消息的消息
类型。此外，还提供了onread的钩子，因此即使是自定义消息类型
只要这个包装不直接提供钩子
实现有线。消息接口，可使用。最后，写钩子
提供，与onread结合使用，可用于跟踪服务器范围
字节计数。

在指定
回调处理程序。这为在以下情况下访问该状态提供了一个干净的方法：
调用回调。

排队消息和清单

QueueMessage函数提供将消息发送到
远程对等体。顾名思义，这使用了一个非阻塞队列。完成了
当消息实际发送时将被通知的通道可以选择
具体说明。某些消息类型最好使用其他类型发送
提供附加功能的功能。

特别感兴趣的是库存消息。而不是手动发送msginv
消息通过queuemessage，库存向量应使用
队列库存函数。它采用批处理和涓涓细流。
智能已知远程对等库存检测和通过使用避免
最近使用的算法。

消息发送助手函数

除了前面描述的裸队列消息函数外，
pushaddrmsg、pushgetblocksmsg、pushgetheadermsg和pushrejectmsg函数
提供方便。当然可以创建和
通过queuemessage手动发送这些消息，这些助手函数提供
通常需要的其他有用功能。

For example, the PushAddrMsg function automatically limits the addresses to the
消息允许的最大数目，并在下列情况下随机化所选地址：
太多了。这允许调用者简单地提供已知部分
地址，比如addrmgr包返回的地址，不用担心
关于细节。

接下来，pushgetblocksmsg和pushgetheadermsg函数将构造适当的
使用块定位器并忽略背对背重复请求的消息。

最后，pushrejectmsg函数可用于轻松创建和发送
根据提供的参数以及
（可选）提供一个标志，使其在消息实际
发送。

同侪统计

A snapshot of the current peer statistics can be obtained with the StatsSnapshot
功能。这包括诸如读取的字节总数和
写入、远程地址、用户代理和协商的协议版本。

登录中

此包通过uselogger提供了广泛的日志记录功能
允许指定btclog.logger的函数。例如，登录
调试级别提供发送和接收的每个消息的摘要，以及
跟踪级别的日志记录提供已分析消息的完整转储，以及
使用类似hexdump-c格式的原始消息字节。

比特币改进建议

此包支持有线包支持的所有BIP。
（https://godoc.org/github.com/btcsuite/btcd/wire_hdr-bitcoin_改进建议）
**/

package peer
